보건복지부 코로나19 감염 현황오픈API는 국내 코로나19 첫 환자 발생일인 2020년 1월 20일이 아닌 [2020-01-01, 2020-02-02 ~ 진행중] 기간의 데이터를 제공합니다.
[2020-01-01 ~ 2020-03-01] 기간의 데이터는 결측치가 존재하여[2020-03-02 ~ 진행중]기간에 대한 데이터를 사용합니다.
import requests
from bs4 import BeautifulSoup as bs
from urllib import parse
import pandas as pd
from datetime import datetime
today = datetime.now().strftime('%Y%m%d') # datetime 라이브러리를 통해 현재 날짜 today 생성
serviceKey = 'API 일반 인증키' # 공공데이터포털에서 발급받은 서비스키
params = {'ServiceKey':parse.unquote(serviceKey), # 서비스키(필수)
'startCreateDt':20200302,
'endCreateDt':today # 데이터 생성일 종료범위(선택) - today(현재 날짜 입력)
# 서비스URL
url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson?'
res = requests.get(url, params=params)
soup = bs(res.text, 'lxml')
items = soup.find_all('item')
dic1 = dict(covid19=[])
for item in items:
dic = {}
for x in item:
if x.name in set(response):
dic[x.name] = x.text
dic1['covid19'].append(dic)
# DataFrame으로 변환
df = pd.DataFrame(dic1['covid19'])
df.columns = df.columns.map(response) # column명에 map함수를 적용하여 한글로 변환
국내 및 전세계 코로나19 실시간 상황판을 제공하는
CoronaBoard에서 제공하는 국내차트대한민국 코로나19 추이 일별 막대그래프를 그려보도록 하겠습니다.¶
# plotly 설치
!pip install plotly
import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots
# 저장한 csv파일 불러오기
data = pd.read_csv('../data/corona.csv')
# 기준일 data type 날짜로 변환
data.기준일 = data.기준일.apply(pd.to_datetime)
data
| 기준일 | 일확진자 | 일사망자 | 일검사완료 | 일격리해제 | |
|---|---|---|---|---|---|
| 0 | 2021-01-04 | 1020 | 19 | 31510 | 733 |
| 1 | 2021-01-03 | 657 | 20 | 30960 | 929 |
| 2 | 2021-01-02 | 820 | 25 | 31017 | 625 |
| 3 | 2021-01-01 | 1028 | 17 | 48848 | 683 |
| 4 | 2020-12-31 | 967 | 21 | 55791 | 835 |
| ... | ... | ... | ... | ... | ... |
| 303 | 2020-03-07 | 483 | 2 | 15661 | 10 |
| 304 | 2020-03-06 | 518 | 7 | 18177 | 20 |
| 305 | 2020-03-05 | 438 | 3 | 16438 | 47 |
| 306 | 2020-03-04 | 516 | 4 | 17997 | 7 |
| 307 | 2020-03-03 | 600 | 6 | 14504 | 3 |
308 rows × 5 columns
df = data.copy()
df = df[df.기준일.dt.month == 12].sort_values('기준일') # 12월 기준일 오름차순 정렬
fig = go.Figure()
# 확진 그래프
fig.add_trace(go.Bar(x=df.기준일.dt.strftime('%m.%d'),
y=df.일확진자,
text=df.일확진자, # 그래프 위 확진 수 보이게 하기
textposition='outside', # text 위치
hovertemplate='기준일: %{x} <br>확진: %{y}명',
name='확진'
)
)
# 사망 그래프
fig.add_trace(go.Bar(x=df.기준일.dt.strftime('%m.%d'),
y=df.일사망자,
text=df.일사망자, # 그래프 위 사망 수 보이게 하기
textposition='outside', # text 위치
hovertemplate='기준일: %{x} <br>사망: %{y}명',
name='사망'
)
)
# 격리해제 그래프
fig.add_trace(go.Bar(x=df.기준일.dt.strftime('%m.%d'),
y=df.일격리해제,
text=df.일격리해제, # 그래프 위 격리해제 수 보이게 하기
textposition='outside', # text 위치
hovertemplate='기준일: %{x} <br>격리해제: %{y}명',
name='격리해제'
)
)
fig.update_layout(xaxis=dict(type='category'), # x축 모든 날짜 보이게 하기
title_text='대한민국 코로나18(COVID-19) 추이 - 2020.12' # 그래프 제목
)
fig.show()
df = data.copy()
df = df[(df.기준일.dt.month == 11)|(df.기준일.dt.month == 12)].sort_values('기준일') # 11월~12월 기준일 오름차순 정렬
fig = go.Figure()
# 확진 그래프
fig.add_trace(go.Bar(x=df.기준일, # 기본 그래프와 달리 '2020-12-01' 날짜 포맷 그대로 입력
y=df.일확진자,
text=df.일확진자, # 그래프 위 확진 수 보이게 하기
textposition='outside', # text 위치
hovertemplate='기준일: %{x} <br>확진: %{y}명',
name='확진'
)
)
# 사망 그래프
fig.add_trace(go.Bar(x=df.기준일, # 기본 그래프와 달리 '2020-12-01' 날짜 포맷 그대로 입력
y=df.일사망자,
text=df.일사망자, # 그래프 위 사망 수 보이게 하기
textposition='outside', # text 위치
hovertemplate='기준일: %{x} <br>사망: %{y}명',
name='사망'
)
)
# 격리해제 그래프
fig.add_trace(go.Bar(x=df.기준일, # 기본 그래프와 달리 '2020-12-01' 날짜 포맷 그대로 입력
y=df.일격리해제,
text=df.일격리해제, # 그래프 위 격리해제 수 보이게 하기
textposition='outside', # text 위치
hovertemplate='기준일: %{x} <br>격리해제: %{y}명',
name='격리해제'
)
)
fig.update_layout(xaxis=dict(type='category'),
title_text='대한민국 코로나18(COVID-19) 추이 - 2020.06~2020.12' # 그래프 제목
)
# Range Slider 추가
fig.update_layout(
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=7, # day기준 7일 = 1week
label="1w",
step="day",
stepmode="backward"),
dict(count=14, # day기준 14일 = 2week
label="2w",
step="day",
stepmode="backward"),
dict(count=1, # month기준 1달 = 1month
label="1m",
step="month",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
# 기간 초기값 설정
initial_range = ['2020-11-30', '2020-12-15']
fig.update_layout(xaxis=dict(range=initial_range))
fig.show()
1w,2w,1m,2m,all버튼으로 그래프 기간 범위 선택이 가능합니다.
아래의 슬라이드는 다른 기간으로 이동이 가능하며 수동으로 기간 범위를 늘이고 줄일수 있습니다.
🌟 공공데이터 포털 오픈API를 활용해 DataFrame으로 변환하여 데이터 탐색 및 시각화를 통해 나만의 분석을 시작할 수 있습니다 !! 🌟¶